// src/utils/request.ts
// 自定义axios
import axios from 'axios'
import checkStatus from './checkStatus';

// const isDev = process.env.NODE_ENV === 'development'

const ins = axios.create({
  //   baseURL: 
})
// 覆写库的超时默认值
// 现在，在超时前，所有请求都会等待 6 秒
ins.defaults.timeout = 6000;

// 请求拦截器
ins.interceptors.request.use((config) => {
  // 所有的请求之前做些什么：头信息传递token

  //   config.headers!.token = store2.get('token') || ''

  return config
}, (error) => {
  return Promise.reject(error) // throw new Error(error)
})

// 响应拦截器
ins.interceptors.response.use((response) => {
  // 拿到服务器数据之前做些什么： 验证token，验证通过，继续，验证不通过，跳转到登录页面
  //   if (response.data.code === '10119') { // 需要登录 -- 登录时保存了adminname token
  //     store2.remove('adminname')
  //     store2.remove('token')

  //     window.location.href = '/login' // BrowserRouter '/login'
  //   }
  return response.data
}, (error) => {

  const { status } = error?.response || {};
  checkStatus(status)
  return Promise.reject(error)
})




// 自定义各种常用的restful api的请求
export default function request(config) {
  // 接口请求 必须参数  url method  data  headers
  const { url = '', method = 'GET', data = {}, headers = {} } = config

  // 区分不同的数据请求 为了执行时传入的数据请求方式统一性 GEt GeT get GET
  switch (method.toUpperCase()) {
    case 'GET':
      return ins.get(url, { params: data })

    case 'POST':
      // 可能数据请求方式 表单提交  文件提交   默认json
      // 表单提交
      if (headers['content-type'] === 'application/x-www-form-url-encoded') {
        // 转换参数  URLSearchParams  / 第三方库 qs
        const p = new URLSearchParams()
        for (const key in data) {
          p.append(key, data[key])
        }
        return ins.post(url, p, { headers })
      }

      // 文件提交
      if (headers['content-type'] === 'multipart/form-data') {
        const p = new FormData()
        for (const key in data) {
          p.append(key, data[key])
        }
        return ins.post(url, p, { headers })
      }

      // 默认 application/json
      return ins.post(url, data)

    // 修改数据 - 所有的数据的更新
    case 'PUT':
      return ins.put(url, data)

    // 删除数据
    case 'DELETE':
      return ins.delete(url, { data })

    // 修改数据 - 部分的数据的更新
    case 'PATCH':
      return ins.patch(url, data)

    default:
      return ins(config)
  }
}